package crm.benedicto.dao;

import crm.benedicto.beans.Permiso;
import crm.benedicto.excepciones.PersistenException;
import crm.benedicto.views.AccesoModulo;
import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class PermisoDAO {
    private Connection conexion;
    private final String SQL_SELECT = "select m.idModulo, m.nombre,m.pagina,p.acceso,p.adicionar,p.editar,p.eliminar from modulo m inner join permiso p on m.idModulo = p.idModulo where p.idRol = ?";  
    private final String SQL_LIST =   "select * from permiso where idRol=?";
    private final String SQL_INSERT = "insert into permiso values(?,?,?,?,?,?)";
    private final String SQL_UPDATE = "update permiso set acceso=?,adicionar = ?, editar =?, eliminar = ? where idRol = ? and idModulo = ?";    
    private final String SQL_DELETE = "delete from permiso where idRol = ?";
    
    public PermisoDAO(ConnectionManager cm){
        this.conexion = cm.getConnection();
    }
    
    public boolean adicionar(Permiso permiso) throws PersistenException{
       boolean correcto = false;
       PreparedStatement comando = null;
       try{
           comando = conexion.prepareCall(SQL_INSERT);
           comando.setInt(1,permiso.getIdRol());
           comando.setInt(2,permiso.getIdModulo());
           comando.setInt(3,permiso.getAcceso());
           comando.setInt(4,permiso.getAdicionar());
           comando.setInt(5,permiso.getEditar());
           comando.setInt(6,permiso.getEliminar());
           if(comando.executeUpdate()>=1){
               correcto = true;
           }
       }catch(Exception e){
           throw new PersistenException(e.getMessage());
       }finally{
           try{
               comando.close();
           }catch(Exception e){
           }
       }
       return correcto;
    }
    
    public boolean editar(Permiso permiso) throws PersistenException{
       boolean correcto = false;
       PreparedStatement comando = null;
       try{
           comando = conexion.prepareCall(SQL_UPDATE);           
           comando.setInt(1,permiso.getAcceso());
           comando.setInt(2,permiso.getAdicionar());
           comando.setInt(3,permiso.getEditar());
           comando.setInt(4,permiso.getEliminar());
           comando.setInt(5,permiso.getIdRol());
           comando.setInt(6,permiso.getIdModulo());
           if(comando.executeUpdate()>=1){
               correcto = true;
           }
       }catch(Exception e){
           throw new PersistenException(e.getMessage());
       }finally{
           try{
               comando.close();
           }catch(Exception e){
           }
       }
       return correcto;
    }
    
    public boolean eliminar(int idRol) throws PersistenException{
       boolean correcto = false;
       PreparedStatement comando = null;
       try{
           comando = conexion.prepareCall(SQL_DELETE);           
           comando.setInt(1,idRol);           
           if(comando.executeUpdate()>=1){
               correcto = true;
           }
       }catch(Exception e){
           throw new PersistenException(e.getMessage());
       }finally{
           try{
               comando.close();
           }catch(Exception e){
           }
       }
       return correcto;
    }
    
    public Map<Integer,AccesoModulo> getMapPermisos(int idRol) throws PersistenException {
        Map<Integer,AccesoModulo> map = null;
        PreparedStatement comando = null;
        try{            
            comando = conexion.prepareStatement(SQL_SELECT);           
            comando.setInt(1, idRol);                        
            ResultSet resultado = comando.executeQuery();
            map= new LinkedHashMap<Integer,AccesoModulo>();
            while(resultado.next()){
                AccesoModulo modulo = new AccesoModulo();
                modulo.setNombre(resultado.getString("NOMBRE"));
                modulo.setPaginaWeb(resultado.getString("PAGINA"));
                if(resultado.getInt("ACCESO")==1){
                    modulo.setAccesible(true);
                }
                if(resultado.getInt("ADICIONAR")==1){
                    modulo.setAdicionable(true);
                }
                if(resultado.getInt("EDITAR")==1){
                    modulo.setEditable(true);
                }
                if(resultado.getInt("ELIMINAR")==1){
                    modulo.setEliminable(true);
                }
                map.put(resultado.getInt("IDMODULO"), modulo);
            }            
            resultado.close();
        }catch(Exception e){            
            throw new PersistenException(e.getMessage());
        }finally{
            try{
                comando.close();
            }catch(Exception e){                
            }
        }                                
        return map;
    }    
}
